package com.Gourmet.Activities;

import java.util.ArrayList;
import java.util.Vector;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.net.ParseException;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;

import com.Gourmet.Activities.R;
import com.GourmetDataBase.SqLiteRestauranes;
import com.adapters.CustomAdapter;
import com.adapters.RowData;
import com.beans.GeneroComidaDTO;
import com.beans.MiLocalizacionDTO;
import com.beans.RestauranesDTO;
import com.driving.DrivingDirections;
import com.driving.DrivingDirections.Mode;
import com.driving.DrivingDirectionsFactory;
import com.driving.Route;
import com.google.android.maps.GeoPoint;

public class ListadoRestauranes extends  ListActivity implements DrivingDirections.IDirectionsListener{
	
	final public static  String MyKey = "mikey";
	private ArrayList<RestauranesDTO> restaurantes = new ArrayList<RestauranesDTO>();
	private ArrayList<String> nombresRestaurantes=new ArrayList<String>();
	private ArrayList<String> direcciones =new ArrayList<String>();
	private ArrayList<Integer> ratings=new ArrayList<Integer>();
	private LayoutInflater mInflater=null;
	private Vector<RowData> data;
	private RowData rd;
	//Obtengo el servicio
	private SqLiteRestauranes servicio = new SqLiteRestauranes();
	//indices de la cantidad de restaurantes
	int indiceRestaurant = 0;
	//indice de ordenamiento
	int indiceOrdenamiento=0;
	//indice de la cantidad de logos
	int cantidadLogos=0;
	//Arreglo de id de las imagenes
	private Integer[] imgid = null;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listadorestauranes);
		setmInflater((LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE));
		data = new Vector<RowData>();

		//Recuperando el objeto enviado
		Bundle extras = getIntent().getExtras();
		
		if (extras != null) {
			GeneroComidaDTO genero = extras.getParcelable(ListadoGenerosComida.MyKey);
			indiceOrdenamiento = extras.getInt(ListadoGenerosComida.MyKeyOrdenamiento);
			MiLocalizacionDTO milocalizacion = extras.getParcelable(ListadoGenerosComida.MyKeyLocalizacion);
			
			//Estableciendo los arreglos de restauranes nombres, direcciones, ratings y logis
			String[] parametro = new String[] {String.valueOf(genero.getCodigo())};	
		    servicio.establecerArreglos(this,parametro, restaurantes, nombresRestaurantes, direcciones, ratings );
		    ArrayList<RestauranesDTO> logos = new ArrayList<RestauranesDTO>();
			servicio.establecerLogos(this, logos);
			 		  
			 //Agrego las imagenes al arreglo de imagenes
				  int indiceImagenes=0;
				  imgid = new Integer[logos.size()];
				  
				  for (RestauranesDTO r1 : restaurantes) {
					for (RestauranesDTO log : logos) {
						if(r1.getCodigo()==log.getCodigo()){			
							imgid[indiceImagenes] = obtenerIdImagen(log.getDescripcion());
							indiceImagenes++;
							break;
						}
					}
				  }
				  
				  //Calculando la distancia y la  ruta por cada restaurant
			  for (RestauranesDTO res : restaurantes) {
						  GeoPoint GeoPointRestaurante = new GeoPoint((int)(res.getLatitud()*1E6), (int)(res.getLongitud()*1E6));
						  GeoPoint  GeoPointMiLocalizacion = new GeoPoint((int)(milocalizacion.getLatitud()*1E6) ,(int) (milocalizacion.getLongitud()*1E6));
						   
						  //Trazamos la ruta y calculamos distancia
				            DrivingDirections.Mode mode = Mode.DRIVING; 
				            DrivingDirections directions = DrivingDirectionsFactory.createDrivingDirections(); 
				            directions.driveTo(GeoPointMiLocalizacion, GeoPointRestaurante, mode, this);
				            
					}
					  
		}	
}
	
//Cuando damos click a alguno de los elementos de la lista.
	public void onListItemClick(ListView parent, View vista, int posicion,
            long id) {        	
		Intent myIntent = new Intent(vista.getContext(), Detalle.class);	
		Bundle bundle = new Bundle();
        bundle.putParcelable(MyKey,(RestauranesDTO)restaurantes.get(posicion));	            
        myIntent.putExtras(bundle);	 	               
        startActivity(myIntent);		
      }

	//*********Para obtener el indice de la foto a travez de su nombre********************************//
	public int obtenerIdImagen(String descripcionRestaurant) {
	    int id = this.getResources().getIdentifier(descripcionRestaurant, "drawable", this.getPackageName());
	    return id;
	}
	//*******************************************************************
	
	public void onDirectionsAvailable(Route route, Mode mode) {
			restaurantes.get(indiceRestaurant).setDistancia(route.getTotalDistance());
			this.indiceRestaurant++;
			if (indiceRestaurant==restaurantes.size()){
				mostrarRestauranes();
			}
	}

	public void onDirectionsNotAvailable() {
		
	}
    
	private void mostrarRestauranes(){
		
		direcciones = new ArrayList<String>();
		
		  if (indiceOrdenamiento==0){
		  
		  //ORDENANDO POR DISTANCIA
		  ArrayList<RestauranesDTO> restauranesOrdenadosMenorAMayor = new ArrayList<RestauranesDTO>();
		  
		  int ordenamiento = 0;
		  nombresRestaurantes = new ArrayList<String>();
		  
		  ratings=new ArrayList<Integer>();
		  while (ordenamiento<restaurantes.size()){
			  RestauranesDTO rest = null;
			  double distanciaMenor=Double.MAX_VALUE;
			  for (RestauranesDTO res : this.restaurantes) {
				  if(!res.getEvaluado()){
					  if(res.getDistanciaNumerica()<distanciaMenor) {
						  distanciaMenor=res.getDistanciaNumerica();
						  rest=res;
					  } 
				  }
			  }	
			  rest.setEvaluado(true);
			nombresRestaurantes.add(rest.getDescripcion());
			direcciones.add(rest.getDireccion() + "  "+ rest.getDistancia());
			ratings.add((Integer)(rest.getRating()));
			  restauranesOrdenadosMenorAMayor.add(rest);
			  ordenamiento++;
		}
		  
		  //Agregando imagenes
		  ArrayList<RestauranesDTO> logos = new ArrayList<RestauranesDTO>();
			 servicio.establecerLogos(this, logos);
			  
			  
			  //Agrego las imagenes al arreglo de imagenes
			  int indiceImagenes=0;
			  imgid = new Integer[logos.size()];
			  
			  for (RestauranesDTO r1 : restauranesOrdenadosMenorAMayor) {
				for (RestauranesDTO log : logos) {
					if(r1.getCodigo()==log.getCodigo()){			
						imgid[indiceImagenes] = obtenerIdImagen(log.getDescripcion());
						indiceImagenes++;
						break;
					}
				}
			  }
			  
			  restaurantes = restauranesOrdenadosMenorAMayor;
			  
		  }	 
		  else
		  {
			  
			  for (RestauranesDTO r : restaurantes) {
					direcciones.add(r.getDireccion() + "  "+ r.getDistancia());
				}
			  
		  }

		 for(int i=0;i<nombresRestaurantes.size();i++){
				try {
				 	rd = new RowData(i,nombresRestaurantes.get(i),direcciones.get(i), ratings.get(i));
				    } catch (ParseException e) {
				    	e.printStackTrace();
				   }
				   data.add(rd);
				}
		 
		   CustomAdapter adapter = new CustomAdapter(this, R.layout.listarestauranes_list,
		                                     R.id.title, data, this.imgid, getmInflater() );
		   setListAdapter(adapter);
		   getListView().setTextFilterEnabled(true);
	}


	public void setmInflater(LayoutInflater mInflater) {
		this.mInflater = mInflater;
	}


	public LayoutInflater getmInflater() {
		return mInflater;
	}

	
}
